基于遗传算法的寻路模拟

学习了些人工智能的东西, 利用遗传算法来写了一个寻路的演示程序, 虽然该算法效率底下, 但作为一个学习程序还是有直观性;

先把代码和结果贴上, 有时间再写分析

遗传算法类

主要有两个类: 基因编码类和基因组类;

"GeGroup.h"

#ifndef  _GEGROUP_HBB_
#define  _GEGROUP_HBB_
#include "HMap.h"
#include "Global.h"
#include <bitset>
class HMap;
class GeCode
{
public:
	GeCode();
	~GeCode();
	std::bitset<LEN_BIT_ROUTE> mGeRoute;
	int mHighestFitSce;
	int mHighestSceStep;
	void Clear();
	// decode generic
	SearchDir DeCode(const int StepIndex);
};

class  GeGroup
{
public:
	GeGroup(HMap& m);
	~GeGroup();
	GeCode mGrop[NUM_GEGROUP];
	GeCode mFitGes[NUM_GEGROUP];
	int mBestGeIndex;
	int mTotalFitSce;
	HMap& mMap;
	bool Epoch();
	bool UpdateFitnessScore();
	GeCode WheelSelect();
private:
	int mGenerationCount;
	static const int mMaxScore = NUM_MAX_GRID*NUM_MAX_GRID*4;
	inline bool  IsCrossOver(){return RandInt(0,10) <= RATE_CROSSOVER;}
	inline bool IsMutation(){return RandInt(0,1000) <= RATE_MUTATION;}
	int CalcuFitScore(const int idx);
	int CalcuPosScore(const point& p);
	void CrossOver(const int mom, const int dad);
	void Mutate(const int geLst);
	bool EvolutionSelection();
	void ShowMarkMap();
};

#endif //  _GEGROUP_HBB_

"GeGroup.cpp"

#include "GeGroup.h"
#include <cassert>
#include <iostream>
#include "HMap.h"
#include <stdlib.h>
using namespace std;

static const int MAX_INT = 0x7fffffff;

GeCode::GeCode():mHighestFitSce(0),mHighestSceStep(0)
{

}
GeCode::~GeCode(){}

SearchDir  GeCode::DeCode(const int StepIndex)
{
	int codePos = StepIndex*LEN_BIT_CODE;
	unsigned Dir = 0;
	Dir |= (1u&mGeRoute[codePos]) | ((1u&mGeRoute[codePos+1])<<1) | ((1u&mGeRoute[codePos+2])<<2);
	return (SearchDir)Dir;
}

void GeCode::Clear()
{
	for(int i = 0; i < LEN_BIT_ROUTE; ++i)
		mGeRoute[i] = 0;
	mHighestSceStep = 0;
	mHighestFitSce = 0;
}

/*******************************
///           class GeGroup
*******************************/
GeGroup:: GeGroup(HMap& m):mBestGeIndex(0),mTotalFitSce(0)
	,mMap(m),mGenerationCount(0)
{
	for(int i = 0; i < NUM_GEGROUP;++i)
	{
		for(int j = 0; j<LEN_BIT_ROUTE;++j)
			mGrop[i].mGeRoute[j] = RandInt(0,1);
	}
}

GeGroup::~ GeGroup()
{
	//dtor
}

int GeGroup::CalcuPosScore(const point& p)
{
	// the longer distance, the lower score
	return 10000/ (abs(p.x - mMap.Ep.x) + abs(p.y - mMap.Ep.y)+1);
}

// calculate the fitness score, and record t
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
商旅寻路问题是一个经典的组合优化问题,遗传算法是一种基于生物进化原理的优化算法,可以用来求解商旅寻路问题。 下面是用遗传算法求解商旅寻路问题的基本步骤: 1. 定义问题的编码方式,一般使用序列编码,即将每个城市表示为一个数字,然后用一个序列来表示旅行路线。 2. 初始化种群,随机生成一些个体作为初始种群。 3. 计算每个个体的适应度,适应度函数可以定义为旅行路线的总距离,即每个城市之间的距离之和。 4. 进行选择操作,使用轮盘赌选择算法或者锦标赛选择算法,选择适应度较高的个体。 5. 进行交叉操作,使用部分映射交叉算法或者顺序交叉算法,将两个个体的某些部分进行交叉,产生新的个体。 6. 进行变异操作,使用插入变异算法或者交换变异算法,对某个个体的某些部分进行变异,引入新的遗传信息。 7. 将新个体加入到种群中,并计算新个体的适应度。 8. 根据设定的停止条件,例如达到最大迭代次数或者适应度达到一定阈值,判断是否终止算法。 9. 输出最优的旅行路线及其总距离。 需要注意的是,遗传算法是一种随机算法,每次运行可能会得到不同的结果。因此,需要多次运行算法并取平均值来得到更可靠的结果。 以上是用遗传算法求解商旅寻路问题的基本步骤,具体实现可以参考遗传算法的相关文献和代码实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值